package com.moons.uvcdemo.eth;

import android.content.Context;
import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.net.Network;
import android.net.NetworkInfo;
import android.os.Build;
import android.net.LinkProperties;
import android.net.ConnectivityManager;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;

import android.provider.Settings.System;

public class TEthernet extends TEthernetBase {
    public static final String TAG = "TEthernet";
//    public static final String CHIP_PROPERTIES_NAME = "ro.yunos.product.chip";
    private final String nullIpInfo = "0.0.0.0";

	private ConnectivityManager connectivityManager;

    private static int sdkVersion;
    static {
        try {
            sdkVersion = Integer.parseInt(android.os.Build.VERSION.SDK);
        } catch (Exception ex) {
        }
    }

    public TEthernet(Context context) {
        super(context);

    }


    //获取mac地址，系统接口
    public String getMac() {
    	try {
			return loadFileAsString("/sys/class/net/eth0/address").trim(); //字符串留空格会导致正则表达false
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return "";
		}
    }

    public static String loadFileAsString(String filePath) throws java.io.IOException{
        StringBuffer fileData = new StringBuffer(1000);
        BufferedReader reader = new BufferedReader(new FileReader(filePath));
        char[] buf = new char[1024];
        int numRead=0;
        while((numRead=reader.read(buf)) != -1){
            String readData = String.valueOf(buf, 0, numRead);
            fileData.append(readData);
        }
        reader.close();
        return fileData.toString();
    }

    public String getIpAddress(String interfaceName) {
		try {
			Enumeration<NetworkInterface> enNetworkInterface = NetworkInterface.getNetworkInterfaces(); //获取本机所有的网络接口
			while (enNetworkInterface.hasMoreElements()) {  //判断 Enumeration 对象中是否还有数据
				NetworkInterface networkInterface = enNetworkInterface.nextElement();   //获取 Enumeration 对象中的下一个数据
				if (!networkInterface.isUp()) { // 判断网口是否在使用
					continue;
				}
				if (!interfaceName.equals(networkInterface.getDisplayName())) { // 网口名称是否和需要的相同
					continue;
				}
				Enumeration<InetAddress> enInetAddress = networkInterface.getInetAddresses();   //getInetAddresses 方法返回绑定到该网卡的所有的 IP 地址。
				while (enInetAddress.hasMoreElements()) {
					InetAddress inetAddress = enInetAddress.nextElement();
					if (inetAddress instanceof Inet4Address) {  //判断是否未ipv4
						return inetAddress.getHostAddress();
					}
//                    判断未lo时
//                    if (inetAddress instanceof Inet4Address && !inetAddress.isLoopbackAddress()) {
//                        return inetAddress.getHostAddress();
//                    }
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "error";
		 
    }

    //获取子网掩码
    public String getNetMask(String interfaceName) {
		try {
			Enumeration<NetworkInterface> networkInterfaceEnumeration = NetworkInterface.getNetworkInterfaces();    //获取本机所有的网络接口
			while (networkInterfaceEnumeration.hasMoreElements()) { //判断 Enumeration 对象中是否还有数据
				NetworkInterface networkInterface = networkInterfaceEnumeration.nextElement(); //获取 Enumeration 对象中的下一个数据
				if (!networkInterface.isUp() && !interfaceName.equals(networkInterface.getDisplayName())) { //判断网口是否在使用，判断是否时我们获取的网口
					continue;
				}

				for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) {    //
					if (interfaceAddress.getAddress() instanceof Inet4Address) {    //仅仅处理ipv4
						return calcMaskByPrefixLength(interfaceAddress.getNetworkPrefixLength());   //获取掩码位数，通过 calcMaskByPrefixLength 转换为字符串
					}
				}
			}
		} catch (SocketException e) {
			e.printStackTrace();
		}
		return "error";
    }

	//通过子网掩码的位数计算子网掩码
	public static String calcMaskByPrefixLength(int length) {

		int mask = 0xffffffff << (32 - length);
		int partsNum = 4;
		int bitsOfPart = 8;
		int maskParts[] = new int[partsNum];
		int selector = 0x000000ff;

		for (int i = 0; i < maskParts.length; i++) {
			int pos = maskParts.length - 1 - i;
			maskParts[pos] = (mask >> (i * bitsOfPart)) & selector;
		}

		String result = "";
		result = result + maskParts[0];
		for (int i = 1; i < maskParts.length; i++) {
			result = result + "." + maskParts[i];
		}
		return result;
	}

    public String getGateWay( ) {
		String[] arr;
		try {
			Process process = Runtime.getRuntime().exec("ip route list table 0");
			String data = null;
			BufferedReader ie = new BufferedReader(new InputStreamReader(process.getErrorStream()));
			BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
			String string = in.readLine();

			arr = string.split("\\s+");
			return arr[2];
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "error";
    }

    public String getDns1(Context context) {

		return "222";
    }

	//通过 getprop 命令获取
	public static String[] getDnsFromCommand() {
		LinkedList<String> dnsServers = new LinkedList<>();
		try {
			Process process = Runtime.getRuntime().exec("getprop");
			InputStream inputStream = process.getInputStream();
			LineNumberReader lnr = new LineNumberReader(new InputStreamReader(inputStream));
			String line = null;
			while ((line = lnr.readLine()) != null) {
				int split = line.indexOf("]: [");
				if (split == -1) continue;
				String property = line.substring(1, split);
				String value = line.substring(split + 4, line.length() - 1);
				if (property.endsWith(".dns")
						|| property.endsWith(".dns1")
						|| property.endsWith(".dns2")
						|| property.endsWith(".dns3")
						|| property.endsWith(".dns4")) {
					InetAddress ip = InetAddress.getByName(value);
					if (ip == null) continue;
					value = ip.getHostAddress();
					if (value == null) continue;
					if (value.length() == 0) continue;
					dnsServers.add(value);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return dnsServers.isEmpty() ? new String[0] : dnsServers.toArray(new String[dnsServers.size()]);
	}

}